#include "app_serial.h"



//设置波特率
int app_serial_set_baudrate(device_t *dev, BaudRate baudrate){
    struct termios attr;
    //获取当前串口属性
    tcgetattr(dev->fd, &attr);
    //设置波特率
    cfsetspeed(&attr, baudrate);
    //设置串口属性
    if (tcsetattr(dev->fd, TCSAFLUSH, &attr) != 0)
    {
        log_debug("设置波特率失败");
        return -1;
    }
    log_debug("设置波特率成功");
    return 0;
    
}
//设置校验位
int app_serial_set_parity(device_t *dev, Parity parity){
    struct termios attr;
    //获取当前串口属性
    tcgetattr(dev->fd, &attr);
    //设置校验位
    attr.c_cflag &= ~(PARENB | PARODD); //清除校验位
    attr.c_cflag |= parity;
    //设置串口属性
    if (tcsetattr(dev->fd, TCSAFLUSH, &attr) != 0)
    {
        log_debug("设置校验位失败");
        return -1;
    }
    log_debug("设置校验位成功");
    return 0;
}
//设置停止位
int app_serial_set_stopbit(device_t *dev, StopBit stopbit){
    struct termios attr;
    //获取当前串口属性
    tcgetattr(dev->fd, &attr);
    //设置停止位
    attr.c_cflag &= ~CSTOPB; //清除停止位
    attr.c_cflag |= stopbit;
    //设置串口属性
    if (tcsetattr(dev->fd, TCSAFLUSH, &attr) != 0)
    {
        log_debug("设置停止位失败");
        return -1;
    }
    log_debug("设置停止位成功");
    return 0;
}
//设置是否阻塞模式
int app_serial_set_block(device_t *dev, int is_block){
    struct termios attr;
    //获取当前串口属性
    tcgetattr(dev->fd, &attr);
    //设置阻塞模式
    if (is_block)
    {
        attr.c_cc[VMIN] = 1;
        attr.c_cc[VTIME] = 0;
        log_debug("设置阻塞模式");
    }else
    {
        //设置非阻塞模式
        attr.c_cc[VMIN] = 0;
        attr.c_cc[VTIME] = 2;
        log_debug("设置非阻塞模式");
    }
    //设置串口属性
    if (tcsetattr(dev->fd, TCSAFLUSH, &attr) != 0)
    {
        log_debug("设置阻塞模式失败");
        return -1;
    }
    log_debug("设置阻塞模式成功");
    return 0;
}
//设置为原始模式
 int app_serial_set_raw(device_t *dev){
    struct termios attr;
    //获取当前串口属性
    tcgetattr(dev->fd, &attr);
    //设置原始模式
    cfmakeraw(&attr);
    //设置串口属性
    if (tcsetattr(dev->fd, TCSAFLUSH, &attr) != 0)
    {
        log_debug("设置原始模式失败");
        return -1;
    }
    log_debug("设置原始模式成功");
    return 0;
 }

 //flush串口数据
int app_serial_tclflush(device_t *dev){
    return tcflush(dev->fd, TCIOFLUSH);
}
 //初始化
int app_serial_init(device_t *dev){
    app_serial_set_baudrate(dev, BAUDRATE_9600);
    app_serial_set_parity(dev, PARITY_NONE);
    app_serial_set_stopbit(dev, STOPBIT_1);
    app_serial_set_block(dev, 0);
    app_serial_set_raw(dev);
    if (app_serial_tclflush(dev) != 0)
    {
        log_debug("flush串口数据失败");
        return -1;
    }
    log_debug("串口初始化成功");
    return 0;
}